package com.example.reflect.springannotation.config;

import com.google.common.base.Throwables;
import lombok.Builder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;

@Slf4j
@Builder
public class CommonScheduler {

    /**
     * 返回class包路径
     */
    private String modelClassPath;
    /**
     * 任务的包路径
     */
    private String scheduleClassPath;

    /**
     * 解析路径调用目标方法，策略模式核心
     * @param s
     * @param o
     * @return
     * @param <S>
     * @param <O>
     */
    public <S,O> Object dispatch(S s,O o){
        try {
            Class<?> clazz = Class.forName(scheduleClassPath);
            CommonSchedulerBase commonSchedulerBase = (CommonSchedulerBase)clazz.newInstance();
            if (!ObjectUtils.isEmpty(commonSchedulerBase)) {
                return commonSchedulerBase.initModel(modelClassPath)
                        .execute(o, s);
            }
        }catch (Exception e){
            log.error("解析路径调用目标方法_调用目标方法异常信息:{}",Throwables.getStackTraceAsString(e));
            throw new RuntimeException("解析路径调用目标方法_调用目标方法异常!");
        }
        return null;
    }
}
